package com.qf.cloud.service1.controller;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.qf.cloud.service1.feign.Service2Client;
import com.qf.cloud2203.domain.entity.Vote;
import com.qf.cloud2203.domain.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;

@RestController
@RequestMapping("/service1")
public class TestController {
    @Autowired
    EurekaClient eurekaClient;
    @Autowired
    Service2Client service2Client;

    @GetMapping("/test6")
    public Vote test6() {
        return null;
    }

    @GetMapping("/test5")
    public Vote test5() {
        Vote vote = new Vote();
        vote.setPhone("5646165000");
        vote.setId(10);

        vote.setVoteNum(6);
        Vote vote1 = service2Client.updateVote(vote);
        return vote1;
    }

    @GetMapping("/test4")
    public List<Vote> test4() {
        List<Vote> voteList = service2Client.getVoteList();
        return voteList;
    }

    /**
     * feignclient进行微服务调用
     *
     * @return
     */
    @GetMapping("/test3")
    public String test3() {
        String home = service2Client.home();
        return home;
    }

    @GetMapping("/test2")
    public ResultVo test2() {
        String serviceName = "GENTOKEN";
        /**
         * 获取指定微服务的信息
         * 参数1：微服务的名称，从eureka中查
         * 参数2：false代表，接口不足https协议
         */
        InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka(serviceName, false);
        //获取接口信息，格式：http://ip:port
        String homePageUrl = instanceInfo.getHomePageUrl();
        //springboot中如何发送http请求
        RestTemplate restTemplate = new RestTemplate();
        //String url = homePageUrl + "vote/token？phone={phone}&name={name}";
        String url = homePageUrl + "vote/token?phone={phone}";
        /**
         * 参数1：url：
         * 参数2：返回的响应体中的数据封装成什么类型，如果返回的是json，可以直接使用hashmap
         * 参数3：用于替换url中大括号部分的内容
         */
        //HashMap result = restTemplate.getForObject(url, HashMap.class, "13866669999","jack");
        HashMap result = restTemplate.getForObject(url, HashMap.class, "13566667777");
        String token = (String) result.get("data");
        String voteServiceName = "VOTE";
        InstanceInfo voteInstanceInfo = eurekaClient.getNextServerFromEureka(voteServiceName, false);
        String voteHostAndPort = voteInstanceInfo.getHomePageUrl();
        String voteUrl = voteHostAndPort + "vote/dovote";
        //处理请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        System.out.println(token);
        httpHeaders.set("token", token);
        //处理请求体
        LinkedMultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add("phone", "13566667777");
        body.add("cadidateId", "2");
        HttpEntity<LinkedMultiValueMap<String, String>> requestEntity = new HttpEntity<>(body, httpHeaders);

        /**
         * 发送http请求的通用方法
         * 参数1：url
         * 参数2：请求的方式，get,post
         * 参数3：封装了请求头和请求体的对象
         * 参数4：返回值封装成什么类型
         * 参数5：变长参数，对应url中{}
         */
        ResponseEntity<HashMap> voteResult = restTemplate.exchange(voteUrl, HttpMethod.POST, requestEntity, HashMap.class);
        return ResultVo.ok(voteResult);
    }

    /**
     * 如何调用已经存在的微服务中的接口
     * 例如，调用token服务的、vote/token？phone=13899998888
     *
     * @return
     */
    @GetMapping("/test1")
    public ResultVo test1() {
        String serviceName = "GENTOKEN";
        /**
         * 获取指定微服务的信息
         * 参数1：微服务的名称，从eureka中查
         * 参数2：false代表，接口不足https协议
         */
        InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka(serviceName, false);
        //获取接口信息，格式：http://ip:port
        String homePageUrl = instanceInfo.getHomePageUrl();
        //springboot中如何发送http请求
        RestTemplate restTemplate = new RestTemplate();
        //String url = homePageUrl + "vote/token？phone={phone}&name={name}";
        String url = homePageUrl + "vote/token?phone={phone}";
        /**
         * 参数1：url：
         * 参数2：返回的响应体中的数据封装成什么类型，如果返回的是json，可以直接使用hashmap
         * 参数3：用于替换url中大括号部分的内容
         */
        //HashMap result = restTemplate.getForObject(url, HashMap.class, "13866669999","jack");
        HashMap result = restTemplate.getForObject(url, HashMap.class, "13866669999");
        System.out.println(result);
        return ResultVo.ok(result.get("data"));
    }

}
